/**********************************************
 * 姓名：fanfutian
 * 时间：2023/11/9                             
 * 文件名：manager.cpp  
 * 功能：管理者功能实现
 *********************************************/
#include "manager.h"
#include "globalFile.h"
#include "computer.h"


// 默认构造
Manager::Manager(){

}

/*
 * 有参构造
 */
Manager::Manager(string name,string pwd){
    this->m_name = name;
    this->m_pwd = pwd;

    // 在登录管理者类的时候就进行容器的初始化
    this->initVector();
}

/*
 * 重写纯虚函数--显示子菜单
 */
void Manager::showMenu(){
    cout << "欢迎管理员 " << this->m_name << " 登录！" << endl;
    while (true){
        int chose = 0;
        cout << "**************************" << endl;
        cout << "\t\t1、添加账号" << endl;
        cout << "\t\t2、查看账号" << endl;
        cout << "\t\t3、查看机房" << endl;
        cout << "\t\t4、清空预约" << endl;
        cout << "\t\t5、注销登录" << endl;
        cout << "*************************" << endl;
        cout << "请输入你的选择：";
        cin >> chose;
        switch(chose){
            case 1:
                this->addIdentity();
                break;
            case 2:
                this->showIdentity();
                break;
            case 3:
                this->showMachineInfo();
                break;
            case 4:
                this->clearInfo();
                break;
            case 5:
                cout << "成功退出登录！" << endl;
                return;
            default:
                cout << "输入错误！！" << endl;
                break;
        }
    }
}


/*
 * 添加账号
 */
void Manager::addIdentity(){
    int choose;
    cout << "请选择创建的账户类型：" << endl;
    cout << "1、添加学生账户\t 2、添加老师账户" << endl;
    cout << "请选择：";
    cin >> choose;
    int id;
    string name,pwd;
    if(choose == 1){
        cout << "请输入学号：";
        cin >> id;
        // 判断id是否重复
        while(this->checkRepeat(id,1)){
            cout << "学生编号存在，请重新创建！" << endl;
            cout << "请输入学号：";
            cin >> id;
        }
    }else if(choose == 2){
        cout << "请输入老师编号：";
        cin >> id;
        // 判断id是否存在
        while(this->checkRepeat(id,2)){
            cout << "老师编号存在，请重新创建！" << endl;
            cout << "请输入老师编号：";
            cin >> id;
        }
    }else{
        cout << "输入错误！"  << endl;
        return;
    }
    cout << "请输入姓名：";
    cin >> name;
    cout << "请输入密码：";
    cin >> pwd;

    // 将添加的账户信息写入对应的文件
    if(choose == 1){
        // 调用写入学生文件的函数
        string fileName = STUDENT_FILE;
        writeFileInfo(fileName,id,name,pwd);
    }else{
        // 调用写入老师文件的函数
        string fileName = TEACHER_FILE;
        writeFileInfo(fileName,id,name,pwd);
    }
    cout << "用户创建成功！！" << endl;
    // 更新容器
    this->initVector();
}



/*
 * 封装一个写入不同文件的函数
 *      使用引用并且用const修饰使内部不能修改值
 */
void Manager::writeFileInfo(const string& fileName,const int& id,const string& name,const string& pwd){
    // 创建文件流对象
    ofstream ofs;
    // 打开文件--以追加和写入的方式打开文件
    ofs.open(fileName,ios::out|ios::app);
    // 写入文件
    ofs << id << " " << name << " " << pwd << '\n';
    // 关闭文件
    ofs.close();
}


/*
 * 初始化容器
 *      将文件中的数据进行封装，封装为对象，存放到指定容器中
 */
void Manager::initVector(){
    // 先将容器的数据清空
    v_stu.clear();
    v_tea.clear();

    // 读取文件信息放入指定容器中
    ifstream ifs;

    // 初始化学生容器
    ifs.open(STUDENT_FILE,ios::in);
    if(!ifs.is_open()){
        cout << "文件不存在！" << endl;
        return;
    }
    Student s;
    while(ifs >> s.m_id && ifs >> s.m_name && ifs >> s.m_pwd){
        // 将文件中的每一行数据封装成对象尾插到vector容器中
        v_stu.push_back(s);
    }
    ifs.close();

    // 初始化老师容器
    ifs.open(TEACHER_FILE,ios::in);
    if(!ifs.is_open()){
        cout << "文件不存在！" << endl;
        return;
    }
    Teacher t;
    while(ifs >> t.m_id && ifs >> t.m_name && ifs >> t.m_pwd){
        // 将文件中的每一行数据封装成对象尾插到vector容器中
        v_tea.push_back(t);
    }
    ifs.close();

    // 初始化机房容器
    ifs.open(COMPUTER_FILE,ios::in);
    if(!ifs.is_open()){
        cout << "文件不存在！" << endl;
        return;
    }
    ComputerRoom cr;
    while(ifs >> cr.com_id && ifs >> cr.com_max_num){
        // 将文件中的每一行数据封装成对象尾插到vector容器中
        v_com.push_back(cr);
    }
    ifs.close();
}


/*
 * 查重--这里使用容器检查，在检查完没有重复的时候写入文件后需要更新容器
 *  id：键盘录入是否和文件中的重复
 *  type：需要查重的类型（老师和学生）
 */
bool Manager::checkRepeat(int id,int type){
    // 如果是学生
    if(type == 1){
        // 遍历容器
        for(vector<Student>::iterator it = v_stu.begin(); it != v_stu.end(); it++){
            if(id == it->m_id){
                return true;
            }
        }
    }else{ // 老师
        // 遍历容器
        for(vector<Teacher>::iterator it = v_tea.begin(); it != v_tea.end(); it++){
            if(id == it->m_id){
                return true;
            }
        }
    }
    // 如果都没有重复就返回false
    return false;
}


/*
 * 定义全局函数printStudent
 */
void printStudent(Student& s){
    cout << "学号：" << s.m_id << " 姓名：" << s.m_name << " 密码：" << s.m_pwd << endl;
}

/*
 * 打印老师的函数
 */
void printTeacher(Teacher& t){
    cout << "职工编号：" << t.m_id << " 姓名：" << t.m_name << " 密码：" << t.m_pwd << endl;
}

/*
 * 打印机房函数
 */
void printComputer(ComputerRoom& cr){
    cout << "机房编号：" << cr.com_id << " 机房最大容量：" << cr.com_max_num << endl;
}


/*
 * 查看账号
 */
void Manager::showIdentity(){
    cout << "有以下账户可供查看：" << endl;
    cout << "1、查看学生账户信息  2、查看老师账户信息" << endl;
    cout << "请选择：";
    int chose;
    cin >> chose;
    if(chose == 1){
        if(v_stu.empty()){
            cout << "学生账户为空！" << endl;
            return;
        }
        // 遍历前面定义的容器---这里使用遍历算法for_each
        cout << "所以学生信息如下：" << endl;
        for_each(v_stu.begin(),v_stu.end(),printStudent);
    }else if(chose == 2){
        if(v_tea.empty()){
            cout << "老师账户为空！" << endl;
            return;
        }
        cout << "所有老师信息如下：" << endl;
        for_each(v_tea.begin(),v_tea.end(), printTeacher);
    }
}


/*
 * 查看机房信息
 */
void Manager::showMachineInfo(){
    cout << "机房信息如下：" << endl;
//    // 遍历机房文件
//    ifstream ifs;
//    ifs.open(COMPUTER_FILE,ios::in);
//    if(!ifs.is_open()){
//        cout << "文件不存在！" << endl;
//        return;
//    }
//    int com_id,com_max_num;
//    while (ifs >> com_id && ifs >> com_max_num){
//        cout << "机房编号："  << com_id << " 最大容量：" << com_max_num << endl;
//    }
//    ifs.close();
    if(v_com.empty()){
        cout << "没有机房信息！！" << endl;
        return;
    }
    for_each(v_com.begin(),v_com.end(), printComputer);
}


/*
 * 清空记录--重新创建预约文件
 */
void Manager::clearInfo(){
    ofstream ofs;
    ofs.open(ORDER_FILE,ios::trunc);
    cout << "预约记录清除成功！" << endl;
    ofs.close();
}